﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using TCC_Hotel.Entidades;
using System.Globalization;
using System.Data.SqlClient;
using System.Configuration;

namespace TCC_Hotel.Repositorio
{
    public class GerenciaRepositorio
    {
        ControleBancoDados controle = new ControleBancoDados();

        /// <summary>
        /// Cria o comando SQL e envia para um método editar os preços das diarias
        /// </summary>
        /// <param name="apartamento">Lista com os preços</param>        
        /// <returns>true se editou ou false se não</returns>
        public bool EditarPreços(List<Preco_Diaria> Precos)
        {
            //Converte o numero decimal de virgula para ponto
            string precoUmHospede = Precos[0].Preco.ToString(CultureInfo.InvariantCulture);
            string precoDoisHospedes = Precos[1].Preco.ToString(CultureInfo.InvariantCulture);
            string precoTresHospedes = Precos[2].Preco.ToString(CultureInfo.InvariantCulture);
            string precoQuatroHospedes = Precos[3].Preco.ToString(CultureInfo.InvariantCulture);
            string precoCincoHospedes = Precos[4].Preco.ToString(CultureInfo.InvariantCulture);

            //definição dos comandos sql
            string sql =
                "UPDATE Preco_Diarias SET " +
                "Preco = " + precoUmHospede + " WHERE NumeroHospedes = " + 1 + "  ";

            sql = sql + " UPDATE Preco_Diarias SET " +
                "Preco = " + precoDoisHospedes + " WHERE NumeroHospedes = " + 2 + "  ";

            sql = sql + " UPDATE Preco_Diarias SET " +
                "Preco = " + precoTresHospedes + " WHERE NumeroHospedes = " + 3 + "  ";

            sql = sql + " UPDATE Preco_Diarias SET " +
                "Preco = " + precoQuatroHospedes + " WHERE NumeroHospedes = " + 4 + "  ";

            sql = sql + " UPDATE Preco_Diarias SET " +
                "Preco = " + precoCincoHospedes + " WHERE NumeroHospedes = " + 5 + "  ";

            //Método que escreve o comando sql nos bancos de dados
            return controle.EscreveBancoDados(sql);

        }

        /// <summary>
        /// Recupera os preços das diarias
        /// </summary>       
        /// <returns>Lista com as diarias</returns>
        public List<Preco_Diaria> RecuperarPrecos()
        {
            List<Preco_Diaria> resposta = new List<Preco_Diaria>();
            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoServidor"].ConnectionString);
            SqlDataReader reader;
            //definição do comando sql
            string sql =
                "SELECT * FROM Preco_Diarias";

            //Cria uma objeto do tipo comando passando como parametro a string sql e a string de conexão
            SqlCommand comando = new SqlCommand(sql, con);

            //--------tenta conectar no servidor externo-----------------------
            try
            {

                //abre a conexao
                con.Open();

                //Verifica se tem algum comando nao executado no servidor principal
                controle.verificaConsistencia();

                //executa a query
                reader = comando.ExecuteReader();

                //le os dados retornados e monta objeto Preco_Diaria
                resposta = ListarPrecos(reader);

                //fecha a conexao
                con.Close();


            }
            //--------Ocorreu excessao, conectar no servidor local-------------------------
            catch (SqlException e)
            {
                //erro referente a servidor inacessivel ou timeout ocorreu
                if (e.Number == 53 || e.Number == -2)
                {
                    //configura para apontar no servidor local
                    SqlConnection con2 = new SqlConnection(ConfigurationManager.ConnectionStrings["AplicacaoLocal"].ConnectionString);
                    comando.Connection = con2;

                    //abre conexao
                    con2.Open();

                    //executa a query
                    reader = comando.ExecuteReader();
                    //le os dados retornados e monta objeto Preco_Diaria


                    //le os dados retornados e monta objeto Preco_Diaria
                    resposta = ListarPrecos(reader);


                    //fecha a conexao
                    con2.Close();
                }

            }
            finally
            {
                con.Close();
            }

            return resposta;


        }

        /// <summary>
        /// Lê dados da tabela correspondente através de um comando SQL os montando a lista que é retornada
        /// </summary>
        /// <param name="reader"></param>
        /// <returns></returns>
        public List<Preco_Diaria> ListarPrecos(SqlDataReader reader)
        {
            List<Preco_Diaria> listaResposta = new List<Preco_Diaria>();

            //le os dados retornados e monta objeto funcionarios
            while (reader.Read())
            {
                listaResposta.Add(new Preco_Diaria()
                {
                    NumeroHospedes = Convert.ToInt32(reader["NumeroHospedes"]),
                    Preco = Convert.ToDouble(reader["Preco"])
                });

            }
            return listaResposta;


        }
    }
}